# SPDX-FileCopyrightText: 2023 EfficiOS, Inc
#
# SPDX-License-Identifier: LGPL-2.1-only

# Man pages are only built if they are enabled at configure time.
#
# They should always be built before creating a distribution tarball.

# Function which adds the source directory prefix and adds a given suffix:
manaddsuffix = $(addsuffix $(1),$(addprefix $(srcdir)/,$(2)))

# List only the names without the .*.txt extension here:
MAN1_NAMES = \
	lttng-gen-tp
MAN3_NAMES = \
	lttng-ust \
	lttng-ust-dl \
	lttng-ust-cyg-profile \
	lttng_ust_tracef \
	lttng_ust_tracelog \
	tracef \
	tracelog

# Man page aliases (generated from other sources):
MAN3_ALIASES = lttng_ust_vtracef.3 lttng_ust_vtracelog.3

# troff man pages:
MAN3_TROFF = \
	do_tracepoint.3 \
	lttng_ust_do_tracepoint.3 \
	lttng_ust_tracepoint.3 \
	lttng_ust_tracepoint_enabled.3 \
	tracepoint.3 \
	tracepoint_enabled.3

# AsciiDoc sources and outputs:
MAN1_TXT = $(call manaddsuffix,.1.txt,$(MAN1_NAMES))
MAN3_TXT = $(call manaddsuffix,.3.txt,$(MAN3_NAMES))
MAN_TXT = $(MAN1_TXT) $(MAN3_TXT) $(MAN8_TXT)
MAN_XML = $(patsubst $(srcdir)/%.txt,%.xml,$(MAN_TXT))

# Common AsciiDoc source files:
COMMON_TXT = \
	$(srcdir)/common-footer.txt \
	$(srcdir)/common-authors.txt \
	$(srcdir)/common-copyrights.txt \
	$(srcdir)/log-levels.txt \
	$(srcdir)/tracef-tracelog-limitations.txt

# AsciiDoc configuration and XSL files:
ASCIIDOC_CONF = $(srcdir)/asciidoc.conf
XSL_FILE = $(srcdir)/manpage.xsl

# Common dependencies:
COMMON_DEPS = $(ASCIIDOC_CONF) $(COMMON_TXT)

# Man pages destinations:
MAN1 = $(addsuffix .1,$(MAN1_NAMES))
MAN3 = $(addsuffix .3,$(MAN3_NAMES)) $(MAN3_ALIASES)
MAN = $(MAN1) $(MAN3)

if ENABLE_MAN_PAGES
# At this point, we know the user asked to build the man pages.
if HAVE_ASCIIDOC_XMLTO

asciidoc_verbose = $(asciidoc_verbose_@AM_V@)
asciidoc_verbose_ = $(asciidoc_verbose_@AM_DEFAULT_V@)
asciidoc_verbose_0 = @echo "  ASCIIDOC  " $@;

xmlto_verbose = $(xmlto_verbose_@AM_V@)
xmlto_verbose_ = $(xmlto_verbose_@AM_DEFAULT_V@)
xmlto_verbose_0 = @echo "  XMLTO     " $@;

xmlto_verbose_out = $(xmlto_verbose_out_@AM_V@)
xmlto_verbose_out_ = $(xmlto_verbose_out_@AM_DEFAULT_V@)
xmlto_verbose_out_0 = 2>/dev/null

# Tools to execute:
ADOC = $(asciidoc_verbose)$(ASCIIDOC) -f $(ASCIIDOC_CONF) -d manpage \
	-a mansource="LTTng" \
	-a manmanual="LTTng Manual" \
	-a manversion="$(PACKAGE_VERSION)"

ADOC_DOCBOOK = $(ADOC) -b docbook
XTO = $(xmlto_verbose)$(XMLTO) -m $(XSL_FILE) man

# Recipes:
%.1.xml: $(srcdir)/%.1.txt $(COMMON_DEPS)
	$(ADOC_DOCBOOK) -o $@ $<

%.1: %.1.xml $(XSL_FILE)
	$(XTO) $< $(xmlto_verbose_out)

%.3.xml: $(srcdir)/%.3.txt $(COMMON_DEPS)
	$(ADOC_DOCBOOK) -o $@ $<

# These pair of files are generated by a single invocation of xmlto, use
# an empty rule that depends on a fake intermediate file to track the
# dependencies without resorting to Group Targets which were only
# introduced in GNU Make 4.3.
lttng_ust_tracef.3 lttng_ust_vtracef.3: lttng_ust_tracef.3.alias
	@# Empty recipe to mark lttng_ust_tracef.3 and lttng_ust_vtracef.3 as rebuilt

lttng_ust_tracelog.3 lttng_ust_vtracelog.3: lttng_ust_tracelog.3.alias
	@# Empty recipe to mark lttng_ust_tracelog.3 and lttng_ust_vtracelog.3 as rebuilt


.INTERMEDIATE: tracef.3.alias tracelog.3.alias lttng_ust_tracef.3.alias lttng_ust_tracelog.3.alias

tracef.3.alias: tracef.3.xml $(XSL_FILE)
	$(XTO) $< $(xmlto_verbose_out)

tracelog.3.alias: tracelog.3.xml $(XSL_FILE)
	$(XTO) $< $(xmlto_verbose_out)

lttng_ust_tracef.3.alias: lttng_ust_tracef.3.xml $(XSL_FILE)
	$(XTO) $< $(xmlto_verbose_out)

lttng_ust_tracelog.3.alias: lttng_ust_tracelog.3.xml $(XSL_FILE)
	$(XTO) $< $(xmlto_verbose_out)

%.3: %.3.xml $(XSL_FILE)
	$(XTO) $< $(xmlto_verbose_out)

# Only clean the generated files if we have the tools to generate them again.
CLEANFILES = $(MAN_XML) $(MAN)
else # HAVE_ASCIIDOC_XMLTO
# Create man page targets used to stop the build if we want to
# build the man pages, but we don't have the necessary tools to do so.
ERR_MSG = "Error: Cannot build target because asciidoc or xmlto tool is missing."
ERR_MSG += "Make sure both tools are installed and run the configure script again."

%.1: $(srcdir)/%.1.txt $(COMMON_DEPS)
	@echo $(ERR_MSG)
	@false

%.3: $(srcdir)/%.3.txt $(COMMON_DEPS)
	@echo $(ERR_MSG)
	@false
endif # HAVE_ASCIIDOC_XMLTO
endif # ENABLE_MAN_PAGES

# Start with empty distributed/installed man pages:
dist_man1_MANS =
dist_man3_MANS =
EXTRA_DIST =

if ENABLE_MAN_PAGES
# Building man pages: we can install and distribute them.
dist_man1_MANS += $(MAN1)
dist_man3_MANS += $(MAN3) $(MAN3_TROFF)
else # ENABLE_MAN_PAGES
# Those are not known by automake yet because dist_man3_MANS is empty
# at this point, so make sure they are distributed.
EXTRA_DIST += $(MAN3_TROFF)
endif # ENABLE_MAN_PAGES

if !ENABLE_MAN_PAGES
dist-hook:
	@echo "Error: Please enable the man pages before creating a distribution tarball."
	@false
endif # !ENABLE_MAN_PAGES

# Always distribute the source files.
EXTRA_DIST += $(MAN_TXT) $(COMMON_TXT) $(XSL_FILE) $(ASCIIDOC_CONF) README.md
